{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "c7016ce2-6834-4317-8997-97b3927550b4",
   "metadata": {},
   "source": [
    "Chapter 15\n",
    "\n",
    "# 有权无向图\n",
    "《线性代数》 | 鸢尾花书：数学不难"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ea95383f-b40e-4250-8984-7f487aed2b67",
   "metadata": {},
   "source": [
    "这段代码从数学角度展示了一个**有权无向图**的构建与可视化过程，目的是建立一个结构清晰的图 $G = (V, E, W)$，其中 $V$ 是节点集合，$E$ 是无向边集合，$W$ 是边权重函数。\n",
    "\n",
    "---\n",
    "\n",
    "首先，调用 `nx.Graph()` 创建一个无向图对象 $G$，这意味着对于任意一条边 $(u, v) \\in E$，也隐含 $(v, u) \\in E$，即边是双向的。接着，调用 `add_nodes_from()` 向图中添加了四个节点 $V = \\{a, b, c, d\\}$，分别代表图中的四个位置或实体。\n",
    "\n",
    "随后通过 `add_edges_from()` 添加边，并为每条边定义一个权重 `weight`，这些权重构成一个函数 $w: E \\rightarrow \\mathbb{R}^+$，表示从一个节点到另一个节点的“代价”或“距离”。具体来说：\n",
    "\n",
    "- $w(a, b) = 3$\n",
    "- $w(a, c) = 8$\n",
    "- $w(a, d) = 5$\n",
    "- $w(b, c) = 6$\n",
    "- $w(c, d) = 2$\n",
    "\n",
    "这使得整张图可以用一个加权邻接矩阵 $A$ 表示，其中 $A_{ij} = w(v_i, v_j)$，否则为 $0$。这个矩阵是对称的，因为图是无向的。\n",
    "\n",
    "接着，代码通过变量 `pos` 显式地指定每个节点在二维平面上的位置：\n",
    "- $a = (0, 0)$\n",
    "- $b = (1, 0)$\n",
    "- $c = (1, 1)$\n",
    "- $d = (0, 1)$\n",
    "\n",
    "这使得图形布局固定，便于可视化。\n",
    "\n",
    "最后，使用 `nx.draw_networkx()` 绘制节点与边结构，并用 `nx.draw_networkx_edge_labels()` 在边上标注每条边的权重，从而使图既包含拓扑结构，也体现了边的数值信息。\n",
    "\n",
    "综上，这段代码完整构建了一个五边的加权无向图，并在平面上实现其可视化表达，表达了数学对象 $G = (V, E, w)$ 的一个具体几何模型。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "97e3c71c-8b9f-4d97-b70d-23e6888af75f",
   "metadata": {},
   "source": [
    "## 初始化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "7d7c462a-c294-4f88-a4a7-6be0b6aecf17",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import networkx as nx"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d84db280-798e-4ce1-b3b4-66a870e9ea62",
   "metadata": {},
   "source": [
    "## 无向图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "e53aa32b-f827-44a3-bba3-3927279c3615",
   "metadata": {},
   "outputs": [],
   "source": [
    "undirected_G = nx.Graph()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9ce0a624-0c65-4f52-8c7a-3f1823123ea8",
   "metadata": {},
   "source": [
    "## 增加节点"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "52fd8065-1144-4886-afe3-840e57de0ee0",
   "metadata": {},
   "outputs": [],
   "source": [
    "undirected_G.add_nodes_from(['a','b','c','d'])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9051a847-e832-4edc-9ab0-89ea42a511d4",
   "metadata": {},
   "source": [
    "## 增加有权边"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "2c8d1948-e2d3-490a-a554-cc50341e47f8",
   "metadata": {},
   "outputs": [],
   "source": [
    "undirected_G.add_edges_from([('a','b', {'weight':3}),\n",
    "                             ('a','c', {'weight':8}),\n",
    "                             ('a','d', {'weight':5}),\n",
    "                             ('b','c', {'weight':6}),\n",
    "                             ('c','d', {'weight':2})])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b08832b2-91fd-40fa-b22a-a03aaba85103",
   "metadata": {},
   "source": [
    "## 定义节点坐标"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "a62cc18d-eb71-4490-8dc0-2731ada91042",
   "metadata": {},
   "outputs": [],
   "source": [
    "pos = {'a':[0, 0], \n",
    "       'b':[1, 0],\n",
    "       'c':[1, 1],\n",
    "       'd':[0, 1]}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a0d0c336-28a2-4190-9567-5fe946ef9fd8",
   "metadata": {},
   "source": [
    "## 可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "ced4448e-0ef3-496a-b3d5-9ed907c7c713",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{('a', 'b'): Text(0.5000002362357918, 5.551115123125783e-17, '3'),\n",
       " ('a', 'c'): Text(0.5000001107982824, 0.5000001107982825, '8'),\n",
       " ('a', 'd'): Text(0.0, 0.5000037252029869, '5'),\n",
       " ('b', 'c'): Text(0.9999999999999999, 0.5000037252029869, '6'),\n",
       " ('c', 'd'): Text(0.49999976376420807, 1.0, '2')}"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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CxoxYgQxhscQZAC4jA8//FDPPPOMXnzxRf3rX/8ixvAoggwAlzBq1Cg999xzevnll/X+++8TY3gcQQaAPxk5cqQGDx6sV199VcOHDyfGyBcEGQD+YMSIEXr++ef12muv6Z///CcxRr4hyADwPx988IFefPFFvfHGGxo6dCgxRr4iyAAg6f3339dLL72kv/3tb3r33XeJMfIdQQbg94YPH65XXnlFf//73/X2228TYxhBkAH4tWHDhum1117TW2+9RYxhFEEG4LeGDh2q119/XW+//baGDBlieg78HEEG4Jfeffddvfnmm3rnnXf097//3fQcQIGmBwBAfnvnnXc0ZMgQ/eMf/9Abb7xheg4giSAD8DPnnis+d7oasAuCDMAvWJalt956S++8846GDRumV1991fQk4AIEGYDPsyxLQ4YM0bvvvqv33ntPL7/8sulJwEUIMgCfZlmW/va3v2no0KHn3/wDsCOCDMBnWZalN954Q8OGDdMHH3ygF154wfQk4LIIMgCfZFmWXn/9dQ0fPlz//ve/NXjwYNOTgCsiyAB8jmVZevXVV/X+++9r5MiReu6550xPAq6KIAPwKZZl6eWXX9YHH3ygDz/8UM8884zpSUCuEGQAPsOyLL300ksaMWKERo8erUGDBpmeBOQaQQbgEyzL0gsvvKCRI0fqP//5jwYOHGh6EnBNCDIAr2dZlgYPHqwPP/xQY8aM0VNPPWV6EnDNCDIAr2ZZlp577jmNHj1aY8eO1RNPPGF6EnBdCDIAr2VZlp555hn95z//0SeffKIBAwaYngRcN4IMwCtZlqVBgwZpzJgx+vTTT9W/f3/Tk4AbQpABeB23262nn35aY8eO1fjx4/XYY4+ZngTcMIIMwKu43W4NHDhQ48aN08SJE/Xoo4+angTkCYIMwGu43W49+eSTGj9+vCZOnKhHHnnE9CQgzxBkAF7B7XbriSee0IQJEzR58mT16dPH9CQgTxFkALbndrv1+OOPa9KkSZoyZYp69+5tehKQ5wgyAFtzu93q37+/pkyZomnTpunhhx82PQnwCIIMwLZycnL02GOPadq0aZo2bZoeeugh05MAjyHIAGwpJydH/fr10/Tp0zV9+nT17NnT9CTAowgyANvJycnRI488ohkzZmjGjBnq0aOH6UmAxxFkALaSk5Ojvn37atasWZo5c6a6d+9uehKQLwgyANs4e/as+vTpozlz5mjmzJl64IEHTE8C8g1BBmALZ8+eVe/evfX5559r9uzZ6tq1q+lJQL4iyACMO3v2rHr16qW5c+dqzpw56tKli+lJQL4jyACMOnv2rB566CF9+eWXmjNnjjp37mx6EmAEQQZgzJkzZ/TQQw9p/vz5+uKLL9SxY0fTkwBjCDIAI86cOaOePXtq4cKFmjt3rjp06GB6EmAUQQaQ786cOaMePXpo8eLFmjt3rtq3b296EmAcQQaQr7Kzs9WjRw8tXbpUX375pdq2bWt6EmALBBlAvsnOzlb37t21bNkyffnll2rTpo3pSYBtEGQA+SI7O1vdunXTihUrNH/+fEVHR5ueBNgKQQbgcadPn1a3bt0UExOjhQsXqnXr1qYnAbZDkAF41OnTp9W1a1fFxsZq4cKFatWqlelJgC0RZAAek5WVpS5duighIUGLFi1SZGSk6UmAbRFkAB6RlZWlzp07KzExUYsWLVJERITpSYCtEWQAeS4rK0udOnWSy+XS4sWLFR4ebnoSYHsEGUCe+u2339SxY0d9/fXXWrJkicLCwkxPArwCQQaQZ3777Td16NBB33zzjZYuXSqn02l6EuA1CDKAPJGZmakOHTrou+++07JlyxQSEmJ6EuBVCDKAG5aZman27dtr9erVWrZsmVq2bGl6EuB1CDKAG5KZmal27dpp7dq1Wr58ue6//37TkwCvRJABXLeMjAy1a9dO69at0/Lly3XfffeZngR4LYIM4LpkZGSoTZs2Wr9+vVasWKF7773X9CTAqxFkANfs1KlTatOmjTZu3KiVK1fqnnvuMT0J8HoEGcA1OXXqlKKjo7Vp0yatXLlSzZs3Nz0J8AkEGUCupaenKzo6Wps3b1ZMTIzuvvtu05MAn0GQAeRKenq6oqKitGXLFsXExKhZs2amJwE+hSADuKq0tDRFRUVp69atio2N1V133WV6EuBzCDKAK0pLS1Pr1q21bds2xcbGqmnTpqYnAT6JIAO4rNTUVLVu3Vo7duxQXFycmjRpYnoS4LMIMoBLSklJUatWrbRr1y7FxcXpzjvvND0J8GkEGcBFUlJSFBkZqd27dysuLk6NGzc2PQnweQQZwAWSk5MVGRmpX375RfHx8WrUqJHpSYBfIMgAzktOTlZERIT27Nmj+Ph4NWzY0PQkwG8QZACSpJMnTyoiIkL79u1TQkKCGjRoYHoS4FcIMgCdPHlS4eHhSkpKUkJCgurXr296EuB3CDLg506cOKHw8HDt379fCQkJqlevnulJgF8iyIAfO378uMLDw3Xw4EElJiaqbt26picBfosgA37q+PHjCgsL0+HDh5WYmKg6deqYngT4NYIM+KFjx44pLCxMR48eVWJiou644w7TkwC/R5ABP3P06FGFhYXp2LFjSkxMVO3atU1PAiCCDPiVo0ePKjQ0VCdOnJDL5dLtt99uehKA/yHIgJ84cuSIQkNDlZycLJfLpdtuu830JAB/4BNBDg4OVtu2bRUcHGx6CmBLhw8fVmhoqFJTU+VyuVSrVi3Tk4A84ysNcFiWZV3toLS0NAUHBys1NVUlSpTIj10A8sihQ4cUGhqqtLQ0uVwu1axZ0/QkwK/ktqE+8QgZwKUdP35cTqdTp06dIsaAzQWYHgDAMyzLUtGiRVWzZk1iDHgBHiEDPsrhcKhgwYJauHChAgL43RuwO4IMeKFDhw5p1apVKlCggGrUqHHZv1kcGMh/4oC34L9WwMts375dUVFRKlu2rPbt26emTZtqxIgRvIwJ8HKcxwK8yP79+9W6dWt17dpVLpdLM2bM0IYNG3T8+HHT0wDcIK8PcnJyskaNGqWBAwfqH//4h5KSkkxPAjwmJiZGf/nLXzR8+HAVLVpU4eHhatKkiX766SdNnz5dCQkJpicCHrVx40bt2bPn/MefffaZWrRoocqVK+vee+/V7NmzDa67MV4X5AoVKujEiROSpD179uiOO+7Qe++9p127dmncuHGqV6+eduzYYXgl4BkOh0NJSUnasGGDJOm9997TkiVLNG/ePI0ePVo9e/bUhAkTDK8EPKdfv37au3evJGnChAl6/PHH1aRJE73xxhtq2rSp+vfvr0mTJpkdeb2sXEhNTbUkWampqbk53KMcDod15MgRy7Isq0ePHlZISIiVkZFhWZZlZWVlWW3btrW6du1qciLgMUlJSVaLFi2s6tWrW126dLEcDoc1b948y7Is68iRI9bgwYOt+++/3zp69KjldrsNrwXyXtGiRa19+/ZZlmVZjRo1ssaNG3fB7TNmzLDuuOMOE9MuK7cN9eqLutauXasJEyaoaNGikqRChQrpzTffVNeuXQ0vAzyjUqVKmj17ttatW6ft27fL7Xarc+fOkqSyZcuqQoUKio2NVbFixeRwOAyvBfJekSJFdOzYMVWpUkUHDhxQs2bNLri9WbNmF5zS9iZed8pa0vkfNKdPn1a5cuUuuK1cuXI6duyYiVlAvqhUqZI6d+6sihUrKisrS6dPnz5/25EjR1S1alXl5OQYXAh4TlRUlMaOHStJatmypebOnXvB7Z9//rlq1KhhYtoN88pHyGFhYQoMDFRaWpp+/vln1alT5/xtv/76q2655RaD64D80bx5cz377LMaNWqUKlSooG3btmn8+PFKTExUUFCQ6XmAR7z33ntq0aKFWrZsqSZNmmjEiBFyuVyqXbu2du7cqTVr1mj+/PmmZ14XrwvykCFDLvj43OnqcxYvXqz77rsvPycBRtx2221avHix+vXrJ4fDoQoVKighIeGybxIC+IIKFSpo48aNGj58uBYvXizLsrRu3TolJSWpRYsW+vbbb9WkSRPTM68Lf+0J8BJut1tut/uid99KTk5Wdna2ChUqpJIlS5oZB+CycttQr3wOGfA3u3fvVvv27ZWdna0//w5dqlQplStXjhgDXs7rTlkD/mbXrl0KCQlRiRIllJmZedHTNAB8A4+QARv7+eef1bJlSwUHBysxMZELFgEf5hNB3r17t9q2bavdu3ebngLkmZ07dyokJESlSpVSYmKibr31VtOTAFvylQb4RJDT0tK0dOlSpaWlmZ4C5IkdO3YoJCREpUuXVkJCwkWvtwfw/3ylAT4RZMCXbN++XSEhIbrllluIMeBHCDJgI9u2bZPT6VTZsmWVkJCgsmXLmp4EIJ8QZMAmtm7dKqfTqXLlyik+Pl5lypQxPQlAPiLIgA389NNPcjqdKl++PDEG/BRBBgzbsmWLQkNDVbFiRcXHx/PSJsBPEWTAoM2bNys0NFSVKlVSXFycbr75ZtOTABhCkAFDfvzxR4WGhqpKlSrEGABBBkzYtGmTwsLCVLVqVcXFxal06dKmJwEwjCAD+Wzjxo0KCwtTtWrVFBsbq1KlSpmeBMAGCDKQjzZs2KCwsDBVr16dGAO4AEEG8sn69esVHh6umjVrKjY2lj+XCOACBBnIBz/88IPCw8NVq1YtxcTEKDg42PQkADZDkAEP+/777xUeHq7atWsTYwCXRZABD1q3bp0iIiJUp04drVixQiVKlDA9CYBNEWTAQ9auXauIiAjVrVuXGAO4KoIMeMCaNWsUGRmp+vXra/ny5QoKCjI9CYDNEWQgj61evVqRkZFq0KABMQaQawQZyEPfffedIiMj1ahRIy1btkzFixc3PQmAlyDIQB759ttv1apVK915553EGMA1I8hAHvj666/VqlUrNWnSREuXLlWxYsVMTwLgZQgycIO++uorRUVFqVmzZsQYwHUjyMANWLVqlaKjo3X33Xdr8eLFKlq0qOlJALwUQQauk8vlUnR0tJo3b65FixYRYwA3hCAD1yExMVHR0dFq0aIFMQaQJwgycI0SEhLUpk0b3X///Vq4cKGKFCliehIAH0CQgWsQFxenNm3aqGXLllqwYAExBpBnCDKQS7GxsWrXrp2cTqfmz5+vwoULm54EwIcQZCAXYmJi1L59e4WGhhJjAB5BkIGrWLlypdq3b6+wsDB9+eWXKlSokOlJAHwQQQauYMWKFerQoYMiIyM1b948YgzAYwgycBnLli1Thw4d1KpVK82dO5cYA/AoggxcwtKlS9WpUydFRUXpiy++UMGCBU1PAuDjCDLwJ0uWLFGnTp3Upk0bff7558QYQL4gyMAfLF68WJ07d1a7du00Z84cYgwg3xBk4H8WLlyoLl26qH379po9e7Zuuukm05MA+BGCDEhasGCBunbtqo4dO2rWrFnEGEC+I8jwe/Pnz1e3bt3UuXNnzZw5kxgDMIIgw6/NmzdPDzzwgLp27aoZM2YoMDDQ9CQAfoogw2/NnTtX3bt3V7du3TR9+nRiDMAoggy/9MUXX6hHjx7q3r27pk2bRowBGEeQ4XfmzJmjBx98UA8++CAxBmAbBBl+Zfbs2erZs6d69uypKVOmqECBAqYnAYAkggw/MnPmTD300EPq1auXJk+eTIwB2ApBhl+YMWOGevXqpd69e2vixInEGIDtEGT4vM8++0y9e/dW3759iTEA2yLI8GnTpk1T79699cgjj2j8+PEKCOBbHoA98dMJPmvq1Knq27ev+vXrp08//ZQYA7A1fkLBJ02ePFmPPPKI+vfvr3HjxhFjALbHTyn4nEmTJqlfv34aMGCAxo4dS4wBeAV+UsGnTJgwQf369dMTTzyhMWPGEGMAXoOfVvAZ48ePV//+/TVw4EBiDMDr8BMLPuHTTz/V448/rqefflofffSRHA6H6UkAcE0IMrzeJ598ogEDBuiZZ57R6NGjiTEAr0SQ4dU+/vhjPfnkk3r22Wc1atQoYgzAaxFkeK0xY8Zo4MCBGjx4sEaOHEmMAXg1ggyv9NFHH+npp5/W888/rxEjRhBjAF6PIMPrjB49Ws8884xefPFFffDBB8QYgE8gyPAqo0aN0rPPPquXX35Z77//PjEG4DMIMrzGyJEjNXjwYL3yyisaPnw4MQbgUwgyvMKIESP0/PPP67XXXtOwYcOIMQCfQ5Bhex988IFefPFFvfHGGxo6dCgxBuCTCDJs7f3339dLL72kN998U++++y4xBuCzCDJsa/jw4XrllVf097//Xe+88w4xBuDTCDJsadiwYXrttdc0ZMgQvf3228QYgM8jyLCdoUOH6vXXX9dbb72lt956y/QcAMgXBBm28u677+rNN9/UO++8oyFDhpieAwD5JtD0AOCccxH+xz/+oTfeeMP0HADIVwQZtvDWW2/p7bffPn+6GgD8DUGGUZZl6a233tI777yjYcOG6dVXXzU9CQCMIMgwxrIsDRkyRO+++67ee+89vfzyy6YnAYAxBBlGWJalv/3tbxo6dOj5N/8AAH9GkJHvLMvSm2++qX/+85/64IMP9MILL5ieBADGEWTkK8uy9Prrr2v48OH697//rcGDB5ueBAC2QJCRbyzL0quvvqr3339fI0eO1HPPPWd6EgDYBkFGvrAsS6+88or+9a9/adSoUXr22WdNTwIAWyHI8DjLsvTSSy9pxIgRGj16tAYNGmR6EgDYDkGGR1mWpRdeeEEjR47Uf/7zHw0cOND0JACwJYIMj7EsS88//7xGjRqlMWPG6KmnnjI9CQBsiyDDIyzL0nPPPafRo0fr448/1pNPPml6EgDYGkFGnrMsS88++6w++ugjffLJJxowYIDpSQBgewQZecqyLA0aNEhjxozRuHHj9Pjjj5ueBABegSAjz7jdbj399NMaO3asxo8fr8cee8z0JADwGgQZecLtdmvgwIEaN26cJk6cqEcffdT0JADwKgQZN8ztduupp57Sp59+qokTJ+qRRx4xPQkAvA5Bxg1xu9164oknNGHCBE2aNEl9+/Y1PQkAvBJBxnVzu90aMGCAJk6cqClTpqh3796mJwGA1yLIuC5ut1v9+/fX5MmTNXXqVPXq1cv0JADwagQZ1ywnJ0ePPfaYpk2bpmnTpunhhx82PQkAvB5BxjXJyclRv379NH36dE2fPl09e/Y0PQkAfAJBRq7l5OTo0Ucf1WeffabPPvtMDz74oOlJAOAzCDJyJScnR3379tWsWbM0c+ZMde/e3fQkAPApBBlXlZOToz59+mj27NmaOXOmHnjgAdOTAMDnEGRc0dmzZ9WnTx/NmTNHs2bNUrdu3UxPAgCfRJBxWWfPnlWvXr00d+5czZkzR126dDE9CQB8FkHGJZ09e1YPP/yw5s2bpzlz5qhz586mJwGATyPIuMiZM2f00EMPaf78+fr888/VqVMn05MAwOcRZFzgzJkz6tmzpxYuXKi5c+eqQ4cOpicBgF8gyDjvzJkzevDBB7Vo0SLNnTtX7du3Nz0JAPwGQYYkKTs7Wz169NCSJUs0b948tWvXzvQkAPArBBnKzs5W9+7dtWzZMn355Zdq27at6UkA4HcIsp/Lzs7WAw88oOXLl2v+/PmKjo42PQkA/BJB9mOnT59Wt27dFBMTowULFigqKsr0JADwWwTZT50+fVpdu3ZVbGysFixYoNatW5ueBAB+jSD7odOnT6tLly6Kj4/XokWLFBkZaXoSAPg9guxnsrKy1KVLFyUkJGjRokWKiIgwPQkAIILsV7KystSpUye5XC4tXrxY4eHhpicBAP6HIPuJrKwsdezYUV999ZWWLFmisLAw05MAAH9AkP3Ab7/9po4dO+rrr7/WkiVLFBoaanoSAOBPCLKPy8zMVIcOHfTdd99p2bJlCgkJMT0JAHAJBNmHZWZmqn379lq9erWWLVumli1bmp4EALgMguyjMjMz1a5dO61du1bLly/X/fffb3oSAOAKCLIPysjIULt27bRu3TotX75c9913n+lJAICrIMg+JiMjQ23bttUPP/ygFStW6N577zU9CQCQCwTZh5w6dUpt2rTRhg0btGLFCrVo0cL0JABALhFkH3Hq1ClFR0dr06ZNWrlype655x7TkwAA14Ag+4D09HRFR0dr8+bNiomJ0d133216EgDgGhFkL5eenq6oqCht2bJFMTExatasmelJAIDrQJC9WFpamqKiorR161bFxsbqrrvuMj0JAHCdCLKXSktLU+vWrbVt2zbFxsaqadOmpicBAG4AQfZCqampat26tXbs2KG4uDg1adLE9CQAwA0iyF4mNTVVrVq10s8//6y4uDjdeeedpicBAPIAQfYiKSkpatWqlXbt2qW4uDg1btzY9CQAQB4hyF4iOTlZkZGR+uWXXxQfH69GjRqZngQAyEME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",
      "text/plain": [
       "<Figure size 600x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize = (6,6))\n",
    "nx.draw_networkx(undirected_G, pos = pos, node_size = 188)\n",
    "\n",
    "edge_labels = nx.get_edge_attributes(undirected_G, 'weight')\n",
    "\n",
    "# 在图上绘制边的权重\n",
    "nx.draw_networkx_edge_labels(undirected_G, pos, edge_labels=edge_labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "34ff2ef7-6fff-43a9-9c2a-22967e6b6e0a",
   "metadata": {},
   "source": [
    "作者\t**生姜DrGinger**  \n",
    "脚本\t**生姜DrGinger**  \n",
    "视频\t**崔崔CuiCui**  \n",
    "开源资源\t[**GitHub**](https://github.com/Visualize-ML)  \n",
    "平台\t[**油管**](https://www.youtube.com/@DrGinger_Jiang)\t\t\n",
    "\t\t[**iris小课堂**](https://space.bilibili.com/3546865719052873)\t\t\n",
    "\t\t[**生姜DrGinger**](https://space.bilibili.com/513194466)  "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:base] *",
   "language": "python",
   "name": "conda-base-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
